﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Tela.Desktop.Utilidades;

namespace LM.Tela.Desktop
{
    public partial class frmTabelaPreco : Form
    {
        private const int ItemNaoSelecionadoCombo = -1;

        public DtoTabelaPreco TabelaDePreco;

        public frmTabelaPreco()
        {
            InitializeComponent();
        }

        private void frmTabelaPreco_Load(object sender, EventArgs e)
        {
            TabelaDePreco = new DtoTabelaPreco();
            TabelaDePreco.ItensTabela = new List<DtoItemTabelaPreco>();
            PrepareTelaParaNovoRegistro();
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            var servico = FabricaGenerica.Crie<IServicoDeTabelaPreco>();

            if (!EmEdicao())
            {
                servico.Cadastre(ObtemTabelaDoFormulario());
                this.ExibaMensagem(GlossarioDeMensagem.MSG01);
            }
            else
            {
                servico.Atualize(ObtemTabelaDoFormulario());
                this.ExibaMensagem(GlossarioDeMensagem.MSG02);
            }

            PrepareTelaParaNovoRegistro();
        }

        private void btNovo_Click(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                var tabelaDePreco = ObtemTabelaDoFormulario();
            }
        }

        private void dbgTabelaPreco_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                TabelaDePreco = new DtoTabelaPreco();
                TabelaDePreco = ((IList<DtoTabelaPreco>)dbgTabelaPreco.DataSource)[e.RowIndex];

                if (TabelaDePreco.ItensTabela == null)
                {
                    TabelaDePreco.ItensTabela = new List<DtoItemTabelaPreco>();
                }

                MostraTabelaPrecoNoFormulario();
            }
        }

        private void btnItensTabela_Click(object sender, EventArgs e)
        {
            var frmItensTabela = new frmItemTabelaPreco(this);
            frmItensTabela.ListaDeItens = TabelaDePreco.ItensTabela.ToList();
            frmItensTabela.ShowDialog(this);
        }

        #region Métodos de Controle

        private void CarragaTabelasCadastradas()
        {
            var servico = FabricaGenerica.Crie<IServicoDeTabelaPreco>();

            var tabelasDePreco = servico.ConsulteTodos();

            dbgTabelaPreco.DataSource = tabelasDePreco;
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(mskTxtCodigo.Text) && mskTxtCodigo.Enabled == false;
        }

        private void PrepareTelaParaNovoRegistro()
        {
            ControladorDeFormulario.LimpaFormulario(this);
            CarragaTabelasCadastradas();
            mskTxtCodigo.Enabled = true;
            mskTxtCodigo.Focus();
        }

        private DtoTabelaPreco ObtemTabelaDoFormulario()
        {
            int codigo;
            if (Int32.TryParse(mskTxtCodigo.Text.Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out codigo))
            {
                TabelaDePreco.Codigo = codigo;
            }

            TabelaDePreco.Nome = txtNome.Text.Trim();

            var dataInicialTexto = mskTxtDataInicio.Text.Split('/');
            if (!dataInicialTexto.Any(string.IsNullOrWhiteSpace))
            {
                TabelaDePreco.DataInicio = new DateTime(
                    Int32.Parse(dataInicialTexto[2], CultureInfo.InvariantCulture),
                    Int32.Parse(dataInicialTexto[1], CultureInfo.InvariantCulture),
                    Int32.Parse(dataInicialTexto[0], CultureInfo.InvariantCulture));
            }

            var dataFinalTexto = mskTxtDataFim.Text.Split('/');
            if (!dataFinalTexto.Any(string.IsNullOrWhiteSpace))
            {
                TabelaDePreco.DataInicio = new DateTime(
                    Int32.Parse(dataFinalTexto[2], CultureInfo.InvariantCulture),
                    Int32.Parse(dataFinalTexto[1], CultureInfo.InvariantCulture),
                    Int32.Parse(dataFinalTexto[0], CultureInfo.InvariantCulture));
            }
            else
            {
                TabelaDePreco.DataFim = DateTime.MaxValue;
            }

            return TabelaDePreco;
        }

        public void MostraTabelaPrecoNoFormulario()
        {
            if (TabelaDePreco != null && TabelaDePreco.Codigo != 0)
            {
                mskTxtCodigo.Text = TabelaDePreco.Codigo.ToString(CultureInfo.InvariantCulture);
                txtNome.Text = TabelaDePreco.Nome;
                mskTxtDataInicio.Text = TabelaDePreco.DataInicio != null
                                       ? TabelaDePreco.DataInicio.ToString(@"dd/MM/yyyy")
                                       : string.Empty;

                mskTxtDataFim.Text = TabelaDePreco.DataFim != null
                                       ? TabelaDePreco.DataFim.ToString(@"dd/MM/yyyy")
                                       : string.Empty;
            }
        }

        #endregion
    }
}
